﻿unit PacketProctol;
 
interface

uses
  Windows, WinSock2;

  
//***********             【数据包说明】            *************/
//  默认1字节对齐
//  请求包： 包头 + 包体 + 业务包
//  应答包： 包头 + 包体 + S应答包(成功，失败) + 业务返回包 + 数据(可选)
//﹝﹞﹤﹥［］｛｝（）《》＃ ※ ▲☆◆⊙


//--------------------------- 客户端  --------------------------------/

//***********           【数据包全局定义】          *************/
const
  CD_RACKET_VERSION             = 1010;                       //协议版本号     1.0.1.0 1010
  CD_RACKET_HEAD                = 64;                         //帧头起始符
  CD_RACKET_END                 = 16;                         //帧头结束符
  
type

  THeadSingature = (
    asData       = $B0, 
    asShutdown   = $B1,
    asPublicKey  = $B2,
    asOpenKey    = $B3,
    asConnect    = $B4,
    asCookie     = $B5,
    asRestart    = $B6,
    asErrMessage = $B7
  );

//｛统一格式：数据包格式｝
  PTDIGlobalPak_Head = ^TDIGlobalPak_Head;
  TDIGlobalPak_Head = Packed Record
    bPakHead:             BYTE;                               //帧头起始符      64
    dVersion:             WORD;                               //协议版本号
    dPacketLen:           Cardinal;                           //数据包长度
  end;              

//｛统一格式：数据包体格式｝
  PTDIGlobalPak_Body = ^TDIGlobalPak_Body;
  TDIGlobalPak_Body  = Packed Record
    bPakLEVEL:            BYTE;                               //数据包等级
    bPakDirection:        BYTE;                               //数据包流向 (S->C, C->S, S->S, C->C, S->B)
    bPakKind:             WORD;                               //业务类别标识(设计时注意大小)
    bPakCmd:              WORD;                               //业务包标识  (设计时注意大小)
  end;

//｛统一格式：数据尾格式 可选｝
  PTDIGlobalPak_End = ^TDIGlobalPak_End;
  TDIGlobalPak_End  = Packed Record
    bCheck:               BYTE;                               //是否检查校验和  [0,1]
    dCheckSum:            WORD;                               //校验和
    bPakEnd:              BYTE;                               //帧结束符
  end;

//｛统一格式：公共应答包格式｝
  PTDIGlobalPak_Responsion = ^TDIGlobalPak_Responsion;
  TDIGlobalPak_Responsion  = Packed Record
    dAnwerID:             Cardinal;
    bState:               BYTE;                               //是否成功  [0,1]
    dMsgLen:              WORD;                               //S返回字符提示长度
  end;

const
  DL_GLOBALPAK_HEAD_LEN         = SizeOf(TDIGlobalPak_Head);        //包头
  DL_GLOBALPAK_BODY_LEN         = SizeOf(TDIGlobalPak_Body);        //包体
  DL_GLOBALPAK_END_LEN          = SizeOf(TDIGlobalPak_End);         //包尾
  DL_GLOBALPAK_RESPONSION_LEN   = SizeOf(TDIGlobalPak_Responsion);  //公共应答包长度

//***********           【数据包体(公共包)定义】          *************/
// 说明：
// 1. 使用双方约定的加密协议, 对数据进行加密，第一次登录

type
//--------------------------【登录包】：------------------------------
// C->S
//﹤认证﹥：      否
//﹤格式﹥：      包头 + 包体 + 登录包(TDIPak_CSLogin)
//﹤命令标志﹥：  SM_REMOTE_LOGIN 200
//﹤数据结构﹥：  TDIPak_CSLogin
  PTDIPak_CSLogin = ^TDIPak_CSLogin;
  TDIPak_CSLogin  = Packed Record
    sUserID:            array [0..15] of CHAR;                    //用户名
    sUserPwd:           array [0..20] of CHAR;                    //密码
  end;

// S->C
//﹤格式﹥：      包头 + 包体 + 登录包(TDIPak_SCLogin)
//﹤命令标志﹥：  CM_REMOTE_LOGIN 300
//﹤格式1﹥：     成功：包头 + 包体 + TDIPak_SCLogin
//﹤格式2﹥：     失败：包头 + 包体 + 公共应答包(TDIGlobalPak_Responsion)
//                      断开连接
//﹤数据结构﹥：  TDIPak_SCLogin
  PTDIPak_SCLogin = ^TDIPak_SCLogin;
  TDIPak_SCLogin  = Packed Record
    bLogin:             BYTE;                                 //登录是否成功  [0,1]
    sEncrypt:           array [0..35] of CHAR;                //S端返回的密钥 GUID
  end;

//--------------------------【时间包】：------------------------------
// C->S
//﹤认证﹥：      否
//﹤格式﹥：      包头 + 包体(时间标识) + 
//﹤命令标志﹥    SM_REMOTE_TIME          =205;
//﹤数据结构﹥：  无

//﹤调用﹥:      S->C
//﹤命令标志﹥：  CM_REMOTE_TIME      	  =305;               
//﹤命令格式﹥：  包头 + 包体(时间标识) + 时间包(TDIPak_SCTime)  
//﹤数据结构﹥：  YYYY-MM-DD HH:MM:SS 长度19
  PTDIPak_SCTime = ^TDIPak_SCTime;
  TDIPak_SCTime   = Packed Record
    sTime:              array [0..18] of CHAR;                //时间
  end;


//--------------------------【认证包】：------------------------------
//﹤认证﹥：      否
//﹤格式﹥：      包头 + 包体 + 认证包 + 业务包 + 数据
// S->C           无
// C->S
//﹤命令标志﹥：  无(中间包)
//﹤命令格式﹥：  用户名+密钥
//﹤数据结构﹥：
  PTDIPak_CSValidate = ^TDIPak_CSValidate;
  TDIPak_CSValidate   = Packed Record
    sUserID:            array [0..15] of CHAR;                //用户名
    sEncrypt:           array [0..35] of CHAR;                //S端返回的密钥 GUID
  end;


//--------------------------【心跳包】：-------------------------------
//﹤认证﹥：      否
//﹤格式﹥：      包头 + 包体(含心跳标志) 
// S->C           无
// C->S
//﹤命令标志﹥：  SM_REMOTE_HEARTBEAT 202
//﹤命令格式﹥：  空
//﹤数据结构﹥：  无

//--------------------------【服务器列表包】：-------------------------------
//﹤认证﹥：      否
//﹤格式﹥：      包头 + 包体(服务器列表) + 认证包  
// S->C           无

// C->S
//﹤格式﹥：      包头 + 包体 + 服务器列表包(TDIPak_CSSeverList) 
//﹤命令标志﹥：  SM_REMOTE_SEVERLIST 206
//﹤命令格式﹥：  服务器名称@服务器名称....
//                服务器状态@服务器状态....
//﹤限制﹥：      服务器名称<=15个汉字
//                服务器状态<=2个汉字 [忙,一般,空闲]
//﹤数据结构﹥：
  PTDIPak_CSSeverList = ^TDIPak_CSSeverList;
  TDIPak_CSSeverList   = Packed Record
    sSeverIPList:           array [0..30*10] of CHAR;           //S端返回服务器名称列表
    sSeverStateList:        array [0..4*10] of CHAR;            //S端返回服务器状态列表
  end;

  PDIPak_DB_GetDataEx = ^TDIPak_DB_GetDataEx;
  TDIPak_DB_GetDataEx = packed record
    dDBPakHead:           BYTE;                               //帧头起始符      64
    dDBVersion:           WORD;                               //版本协议
    dDBCompress:          BYTE;
    dDBPacketLen:         Cardinal;                           //数据长度
  end;

const
  DL_PAK_CSLOGIN_LEN        = SizeOf(TDIPak_CSLogin);     //C登录
  DL_PAK_SCLOGIN_LEN        = SizeOf(TDIPak_SCLogin);     //S登录返回
  DL_PAK_SCTIME_LEN         = SizeOf(TDIPak_SCTime);      //S时间返回
  DL_PAK_SCVALIDATE_LEN     = SizeOf(TDIPak_CSValidate);  //S身份验证返回
  DL_PAK_SCSERVERLIST_LEN   = SizeOf(TDIPak_CSSeverList); //S服务器列表返回
  DL_PAK_DBGETDATAEX_LEN    = SizeOf(TDIPak_DB_GetDataEx);

//***********             【事件包全局定义】          *************/
type

//｛统一格式：事件包头格式｝
  PTDIGlobalPak_EventHeader = ^TDIGlobalPak_EventHeader;
  TDIGlobalPak_EventHeader  = Packed Record
    dServerIndex:       WORD;                             //负载服务器
    dServerMapID:       WORD;                             //负载服务器索引
    dEventKind:         Cardinal;                         //事件类别
    dEventCmd:          Cardinal;                         //事件标志
    dMapID:             WORD;                             //客户端索引
    pakClientSession:   TGUID;                            //客户端GUID Session
    m_Socket:           TSocket;                          //客户端Socket
    dPakEventLen:       Integer;                          //事件包长度
  end;

implementation

end.
